{
  crateRegistries,
  lib,
}:

{
  name,
  version,
  source,
  checksum,
  ...
}:
let
  substr = builtins.substring;

  # https://doc.rust-lang.org/cargo/reference/registries.html
  nameLen = builtins.stringLength name;
  prefix =
    if nameLen == 1 then
      "1"
    else if nameLen == 2 then
      "2"
    else if nameLen == 3 then
      "3/${substr 0 1 name}"
    else
      "${substr 0 2 name}/${substr 2 4 name}";

  knownRegistries = "\n  " + lib.concatStringsSep "\n  " (builtins.attrNames crateRegistries) + "\n";
  registry =
    crateRegistries.${source} or (throw ''
      not sure how to download crates from ${source}.
      known registries are: ${knownRegistries}
      for example, this can be resolved with:

      craneLib = crane.lib.''${system}.appendCrateRegistries [
        (lib.registryFromDownloadUrl {
          dl = "https://static.crates.io/crates";
          indexUrl = "https://github.com/rust-lang/crates.io-index";
        })

        # Or, alternatively
        (lib.registryFromGitIndex {
          url = "https://github.com/Hirevo/alexandrie-index";
          rev = "90df25daf291d402d1ded8c32c23d5e1498c6725";
        })

        # Or even
        (lib.registryFromSparse {
          indexUrl = "https://index.crates.io/";
          configSha256 = "d16740883624df970adac38c70e35cf077a2a105faa3862f8f99a65da96b14a3";
        })
      ];

      # Then use the new craneLib instance as you would normally
      craneLib.buildPackage {
        # ...
      }
    '');
in
{
  fetchurlExtraArgs = registry.fetchurlExtraArgs or { };
  url =
    builtins.replaceStrings
      [
        "{crate}"
        "{version}"
        "{prefix}"
        "{lowerprefix}"
        "{sha256-checksum}"
      ]
      [
        name
        version
        prefix
        (lib.toLower prefix)
        checksum
      ]
      registry.downloadUrl;
}
